<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      #button {
        width: 100px;
        height: 50px;
      }
    </style>
  </head>
  <body>
    <button id="button">点击切换颜色</button>
    <script>
      // ES6 允许使用 => 定义函数
      // 声明一个函数
      let fn1 = function () {};
      let fn2 = (a, b) => {
        return a + b;
      };
      // 调用函数
      let result = fn2(1, 2);
      console.log(result);

      // 1.this 是静态的 this始终指向函数声明时所在作用域下的this的值
      function getName() {
        console.log(this.name);
      }
      let getName2 = () => {
        console.log(this.name);
      };
      // 设置 window对象的 name 属性
      window.name = "张三";
      const obj = {
        name: "李四",
      };
      // 直接调用
      getName(); // 张三
      getName2(); // 张三
      // call方法调用,改变this的指向
      getName.call(obj); // 李四
      getName2.call(obj); // 张三

      // 2.不能作为构造函数实例化对象
      let Person = (name,age)=>{
        this.name = name; // this指向window
        this.age = age;
      }
      let me = new Person("xinxin",20);
      console.log(me); // Person is not a constructor

      // 3.不能使用 arguments 变量
      let fn = () => {
        console.log(arguments);
      };
      fn(1, 2, 3); //  arguments is not defined

      // 4.箭头函数的简写
      // 1)省略小括号,当形参有且只有一个时
      let pow = a => {
        console.log(Math.pow(a, 2));
      };
      pow(2);
      // 2)省略大括号,当代码体只有一条语句时,return语句也必须省略,且语句的执行结果就是函数的返回值
      let add = (a, b) => a + b;
      console.log(add(1, 2));

      // 5.不能用于动态获取 this
      const button = document.getElementById("button");
      button.onclick = () => {
        console.log(this); // window
        this.style.background = "red"; // 报错
      };
      button.onclick = function () {
        console.log(this); // buttom元素
        this.style.background = "red";
      };
    </script>
  </body>
</html>
